//
// Created by squbirreland on 2021/11/19.
//

#ifndef RLIB_LOOP_QUEUE_H
#define RLIB_LOOP_QUEUE_H

#include "../cpp/types.h"
#include "array.h"

/**
 * 环形队列 更高效率的可拓容队列
 * @author Squbirreland
 */
struct LoopQueue {
    void *bp_start;
    void *bp_end;
    void *start;
    void *end;
    usize size;
    usize cap;
    usize type_size;
};

/**
 * 创建一个LoopQueue
 * @param type_size 类型大小
 * @param cap 初始容量
 * @return LoopQueue* 如果参数任意为0 返回NULL
 */
struct LoopQueue *new_loop_queue(usize type_size, usize cap);

/**
 * 释放LoopQueue 会释放其内部的空间
 * 如果不想释放内部空间 请直接free
 * @param loop_queue 结构指针
 */
void free_loop_queue(struct LoopQueue *loop_queue);

/**
 * 从队列中取出头部值
 * (值复制到新开辟的内存中)
 * @param loop_queue 结构指针
 * @return void* 如果size==0 返回NULL
 */
void *loop_queue_pop_first(struct LoopQueue *loop_queue);

/**
 * 往队列中增加一个值
 * 会从value中复制内存到队列
 * 如果容量不足 会发生拓容
 * @param loop_queue 结构指针
 * @param value 值
 */
void loop_queue_push(struct LoopQueue *loop_queue, void const *value);

/**
 * 对队列进行拓容
 * 开辟新内存空间 cap*=2
 * 当前start直到end复制给新内存
 * 释放原有内存并重新调整结构指针指向
 * @param loop_queue 结构指针
 */
void loop_queue_expansion(struct LoopQueue *loop_queue);


char *loop_queue_to_json(struct LoopQueue *loop_queue);

struct Array *loop_queue_to_array(const struct LoopQueue *loop_queue);

#endif //RLIB_LOOP_QUEUE_H
